/*
 * TablaEspacioLibre.cpp
 *
 *  Created on: 25/10/2009
 *      Author: hernan
 */

#include "TablaEspacioLibre.h"
#include <sstream>

TablaEspacioLibre::TablaEspacioLibre(const string& nombrearch, int Tamanio) {

	const string sufijotabla="ESPACIOLIBRE";

	TamanioCubo = Tamanio;


	nombrearchivo=nombrearch + sufijotabla;

	arch= new ArchivoTexto(nombrearchivo);

	DeserealizarTabla();




}

TablaEspacioLibre::~TablaEspacioLibre() {

	delete arch;

}


void TablaEspacioLibre::DeserealizarTabla()
{
	string cadena;
	string cadenaaux;
	char c='0';
	int i;
	NodoEspacioLibre Nodo;
	int Archcreado=0;

	Nodo.SetEspacioLibre(TamanioCubo);

	Nodo.SetNroBloque(0);

	arch->leerLinea(cadena);

	while ((cadena.capacity()!=0)&& (cadena.empty()==0))

	{

	i =0;
	Archcreado=1;
	c='0';

	while (c!='.')
	{

		c=cadena.at(i);

		if ((c!='.')&&(c!='/')&&(c!='%'))
		{
			cadenaaux.push_back(c);
		}

		if (c=='/')
		{
			Nodo.SetNroBloque(atoi(cadenaaux.c_str()));

			cadenaaux.clear();

		}

		if (c=='%')
		{

			Nodo.SetEspacioLibre(atoi(cadenaaux.c_str()));

			cadenaaux.clear();

			TablaEsp.push_back(Nodo);


		}

		i++;


	};
		arch->leerLinea(cadena);

	};


return;

}

void TablaEspacioLibre::SerializarTabla()
{

	string cadena;
	const char separador1= '/';
	const char separador2= '%';
	int longitud;
	int FIN=0;

	arch->clean();
	arch->irAlPrincipio();

	cadena.clear();

	NodoEspacioLibre Nodo;

	list <NodoEspacioLibre>::iterator it;

	it = TablaEsp.begin();

	while (FIN==0)
	{
		longitud=0;

	for(; ((it != TablaEsp.end())&& (longitud < 10)); ++it )
	   {
	   	Nodo= (*it);

	   	std::string s;
	   	std::stringstream out;

	   	out << Nodo.GetNroBloque();


	   	s=out.str();

	   	cadena=cadena+s;

	   	s.clear();

	   	cadena.push_back(separador1);

	   	std::stringstream out1;

	   	out1 << Nodo.GetEspacioLibre();

	   	s=out1.str();

	   	cadena=cadena+s;

	   	cadena.push_back(separador2);

	   	longitud++;

	    }

		if ((it==TablaEsp.end())&&(longitud==0))
			{
				FIN=1;
				return;
			}

		cadena.push_back('.');

		arch->escribir(cadena);

		cadena.clear();

		arch->terminarLinea();

	};


}


int TablaEspacioLibre::GetEspacioLibre(int nrocubo)
{

	NodoEspacioLibre Nodo;

	list <NodoEspacioLibre>::iterator it;


	    for( it = TablaEsp.begin(); it != TablaEsp.end(); ++it )
	    {
	    	Nodo= (*it);

	    	if (Nodo.GetNroBloque()==nrocubo)
	    	{
	    		return Nodo.GetEspacioLibre();
	    	}

	    }

	return -1;
}


void TablaEspacioLibre::SetEspacioLibre(int nrocubo, int espacio)
{

	list <NodoEspacioLibre>::iterator it;




	    for( it = TablaEsp.begin(); it != TablaEsp.end(); ++it )
	    {


	    	if ((*it).GetNroBloque()==nrocubo)
	    	{


	    		(*it).SetEspacioLibre(espacio);



	    		return;
	    	}

	    }

	// Lista vacia o nro de bloque no se encuentra en lista

	    NodoEspacioLibre Nodo;

	    Nodo.SetNroBloque(nrocubo);

	    Nodo.SetEspacioLibre(espacio);

	TablaEsp.push_back(Nodo);

	return;


}

